#ifndef OCTREE_RTS_HH_
# define OCTREE_RTS_HH_

# include "node_rts.hh"
# include "octree.hh"

// singleton pour n'avoir qu'un seul octree par server
class OctreeRts : public Octree
{
public:
  static OctreeRts* Instance (unsigned int size = 4096)
  {
    if (!oct_)
      oct_ = new OctreeRts (size);

    return (oct_);
  }

  ~OctreeRts ();

  // ajout et destruction d'objets de l'octree
  void add_obj (Object* obj);
  bool delete_obj (Object* obj);

  // recherche des objets en collisions pour la physique
  void accept (PhysicFunctor* phy);
  // recherche des objets pour l'affichage
  void accept (DisplayFunctor* disp);
  // recherche des surfaces pour l'affichage
  void accept (MapFunctor* mf);
  // on veut envoyer des objects a un client contenu dans le block de 128 en pos
  void accept (GetObjectFunctor* objf, Vector2d* pos);

  // insertion de la map dans l'octree
  void insert_map (Map* map);

  // true = map deja inseree, false = pas encore
  bool map_is_loaded_get () const
  {
    return map_is_loaded;
  }

private:
  // methodes et attributs du singleton
  OctreeRts (unsigned int size);

  static OctreeRts* oct_;

  // attributs
  NodeRts* tab_256_;
  List<Object*>** overlap_;

  int NB_NODE_256; // nombre de noeuds de taille 256
  int NB_OVERLAP; // nombre de chevauchement

  bool map_is_loaded;

  int calc_nb_node_pred (int index); // renvoi le nombre de noeud de l'etage avant index
  int index_get (int step); // renvoi l'index du premier noeud du tableau de taille step
};

#endif /// !OCTREE_RTS_HH_
